import { h } from 'snabbdom';
import vnode from './vnode';

// 低配版的h函数
/**
 * 形态①  h('div', {}, '文字')
 * 形态②  h('div', {}, [])
 * 形态③  h('div', {}, h())
 */
export default function (sel, data, c) {
  // 检查参数的个数
  if (arguments.length != 3) {
    throw Error('对不起，h函数必须传入3个参数，我们是低配版的h函数');
  }
  // 检查c函数
  if (typeof c == 'string' || typeof c == 'number') {
    // 说明现在调用函数为形态①
    return vnode(sel, data, undefined, c, undefined);
  } else if (Array.isArray(c)) {
    // 收集children
    let children = [];
    // 说明现在调用函数为形态②
    for (let i = 0; i < c.length; i++) {
      if (!(typeof c[i] == 'object' && c[i].hasOwnProperty('sel'))) {
        throw new Error('传入的数组参数中有项不是h函数');
      }
      children.push(c[i]);
    }
    return vnode(sel, data, children, undefined, undefined);
  } else if (typeof c == 'object' & c.hasOwnProperty('sel')) {
    // 说明现在调用函数为形态③
    let children = [c];
    return h(sel, data, children, undefined, undefined);
  } else {
    throw Error('传入的三个参数类型不对');
  }
}